"""
原理图1：N<n时 ，样本少，特征多，特征多可以学到很多信息 学习能力强 ，但是样本又少 很容易就
再样本上学得特别好 完全拟合样本 而导致其他数据上不好 即过拟合
原理图2：只要加上一个项就不会过拟合了  P逆等于P的转置  行列式等于特征值得积
原理图3：二次型：矩阵 左成行向量 右乘列向量 （非0） 若大于0 则特征值大于0 矩阵可逆
         转置乘自己是自己得模长 模长大于等于0
正则项：数学上：就是原本矩阵不一定可逆  想到加一恒正数就可逆了 然后再算求导前的式子
        理论上：过拟合 加上一项与系数有关的项 最小化损失时会最小化它 从而减小参数
                参数小了  学习能力小了  拟合程度小了
"""

from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression, Lasso, Ridge, ElasticNet
from sklearn.model_selection import cross_val_score

x, y =fetch_california_housing(return_X_y=True)

"""      
线性回归  lasso  岭回归  弹性网
"""
lr = LinearRegression()

loss = -cross_val_score(lr, x, y, cv=5, scoring='neg_mean_squared_error').mean()

print(y.min(), y.max())
print(loss)

lasso = Lasso(alpha=0.01)
ridge = Ridge(alpha=0.01)
elasticnet = ElasticNet(alpha=0.01)

loss1 = -cross_val_score(lasso, x, y, cv=5, scoring='neg_mean_squared_error').mean()
loss2 = -cross_val_score(ridge, x, y, cv=5, scoring='neg_mean_squared_error').mean()
loss3 = -cross_val_score(elasticnet, x, y, cv=5, scoring='neg_mean_squared_error').mean()
print(loss1, loss2, loss3)
